import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import { login as loginApi, logout as logoutApi, getUserInfo as getUserInfoApi } from '@/api/auth'

export const useAuthStore = defineStore('auth', () => {
    // 状态 - 使用 sessionStorage 存储
    const token = ref(sessionStorage.getItem('token') || '')
    
    // 安全地解析 userInfo
    let parsedUserInfo = null
    try {
        const storedUserInfo = sessionStorage.getItem('userInfo')
        if (storedUserInfo) {
            parsedUserInfo = JSON.parse(storedUserInfo)
        }
    } catch (error) {
        console.warn('解析用户信息失败，已清除无效数据:', error)
        sessionStorage.removeItem('userInfo')
    }
    const userInfo = ref(parsedUserInfo)

    // 计算属性
    const isLoggedIn = computed(() => !!token.value)

    // 登录方法
    async function login(username, password) {
        try {
            // 调用登录 API
            const res = await loginApi({ username, password })
            
            if (res.code === 200 || res.code === 0) {
                // 验证返回的数据
                if (!res.data) {
                    console.error('登录返回数据为空:', res)
                    throw new Error('登录返回数据格式错误')
                }

                console.log('后端返回的原始数据:', res)

                // 获取 token（优先使用data中的token）
                const responseToken = res.data.token || res.data.accessToken || res.token || res.data.access_token
                
                // 获取用户信息
                const responseUserInfo = res.data
                
                // 验证token是否存在
                if (!responseToken) {
                    console.error('❌ 后端未返回token，登录数据:', res.data)
                    throw new Error('登录失败：未获取到token')
                }

                console.log('✅ 登录成功，保存数据:', {
                    token: responseToken,
                    userInfo: {
                        id: responseUserInfo.id,
                        username: responseUserInfo.username,
                        realName: responseUserInfo.realName
                    }
                })

                // 保存 token 和用户信息
                token.value = responseToken
                userInfo.value = responseUserInfo

                // 持久化存储到 sessionStorage
                sessionStorage.setItem('token', responseToken)
                sessionStorage.setItem('userInfo', JSON.stringify(responseUserInfo))

                return { success: true, message: res.message || '登录成功' }
            } else {
                // 登录失败，抛出错误
                throw new Error(res.message || '登录失败')
            }
        } catch (error) {
            // 如果错误信息不是网络错误，直接抛出（比如密码错误等业务错误）
            const isNetworkError = error.message === 'Network Error' || 
                                   error.code === 'ECONNABORTED' || 
                                   error.message.includes('timeout') ||
                                   error.message.includes('ECONNREFUSED')
            
            if (!isNetworkError) {
                // 这是业务逻辑错误（如密码错误），不使用模拟登录
                throw error
            }
            
            // 如果是网络错误或后端未启动，使用模拟数据
            console.warn('后端服务未启动，使用模拟数据登录', error)
            
            // 模拟登录逻辑（仅用于开发调试）
            if (username && password) {
                const mockToken = 'mock-jwt-token-' + Date.now()
                const mockUserInfo = {
                    username: username,
                    id: 1,
                    name: username,
                    role: 'admin'
                }

                token.value = mockToken
                userInfo.value = mockUserInfo

                // 持久化存储到 sessionStorage
                sessionStorage.setItem('token', mockToken)
                sessionStorage.setItem('userInfo', JSON.stringify(mockUserInfo))

                return { success: true, message: '登录成功（模拟数据）' }
            } else {
                throw new Error('用户名或密码不能为空')
            }
        }
    }

    // 登出方法
    async function logout() {
        try {
            // 调用登出 API
            await logoutApi()
        } catch (error) {
            console.warn('登出接口调用失败:', error)
        } finally {
            // 无论接口是否成功，都清除本地状态
            token.value = ''
            userInfo.value = null
            
            // 清除所有 sessionStorage 数据
            sessionStorage.clear()
            
            // 同时清除可能存在的 localStorage 数据（兼容旧数据）
            localStorage.clear()
            
            console.log('用户已登出，所有数据已清理')
        }
    }

    // 获取用户信息
    async function getUserInfo() {
        try {
            const res = await getUserInfoApi()
            if (res.code === 200 || res.code === 0) {
                userInfo.value = res.data
                sessionStorage.setItem('userInfo', JSON.stringify(res.data))
                return res.data
            }
        } catch (error) {
            console.warn('获取用户信息失败:', error)
            return null
        }
    }

    // 检查登录状态
    function checkAuth() {
        const storedToken = sessionStorage.getItem('token')
        if (storedToken) {
            token.value = storedToken
            const storedUserInfo = sessionStorage.getItem('userInfo')
            if (storedUserInfo) {
                try {
                    userInfo.value = JSON.parse(storedUserInfo)
                } catch (error) {
                    console.warn('解析用户信息失败:', error)
                    sessionStorage.removeItem('userInfo')
                }
            }
            return true
        }
        return false
    }

    return {
        token,
        userInfo,
        isLoggedIn,
        login,
        logout,
        getUserInfo,
        checkAuth
    }
})

